package case_package1;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class Test {
    public static void main(String[] args) throws IOException {
        /*
            获取姓氏：https://hanyu.baidu.com/s?wd=%E7%99%BE%E5%AE%B6%E5%A7%93&device=pc&from=home
            获取男生名字：http://www.haoming8.cn/baobao/12560.html
            获取女生名字：http://www.haoming8.cn/baobao/4155.html
         */

        //1、定义变量记录网址
        String familyNameNet = "https://hanyu.baidu.com/s?wd=%E7%99%BE%E5%AE%B6%E5%A7%93&device=pc&from=home";
        String boyNameNet = "http://www.haoming8.cn/baobao/12560.html";
        String girlNameNet = "http://www.haoming8.cn/baobao/4155.html";

        //2、爬取数据，把网址上所有的数据拼接成一个字符串
        String familyNameStr = webCrawler(familyNameNet);
        String boyNameStr = webCrawler(boyNameNet);
        String girlNameStr = webCrawler(girlNameNet);

        //3、利用正则表达式，把其中符合要求的数据获取出来
        ArrayList<String> familyNameTempList = getData(familyNameStr, "(.{4})(，|。)", 1);
        ArrayList<String> boyNameTempList = getData(boyNameStr, "([\\u4e00-\\u9fa5]{2})(、|。)", 1);
        ArrayList<String> girlNameTempList = getData(girlNameStr, "(.. ){4}..", 0);


        //4、处理数据
        //familyNameTempList（姓氏）
        //处理方案：把每一个姓氏拆开并添加到一个新的集合当中
        ArrayList<String> familyNameList = new ArrayList<>();
        for (String str : familyNameTempList) {
            for (int i = 0; i < str.length(); i++) {
                char c = str.charAt(i);
                familyNameList.add(c + "");
            }
        }
        //System.out.println(familyNameList);

        //boyNameTempList（男生的名字）
        //处理方案：去除其中的重复元素
        ArrayList<String> boyNameList = new ArrayList<>();
        for (String str : boyNameTempList) {
            if (!boyNameList.contains(str)) {
                boyNameList.add(str);
            }
        }
        //System.out.println(boyNameList);

        //girlNameTempList（女生的姓名）
        //处理方案：把里面的每一个元素用空格进行切割，得到每一个女生的名字
        ArrayList<String> girlNameList = new ArrayList<>();
        for (String str : girlNameTempList) {
            String[] arr = str.split(" ");

            for (int i = 0; i < arr.length; i++) {
                girlNameList.add(arr[i]);
            }
        }
        //System.out.println(girlNameList);

        //5、生成数据
        //姓名（唯一）-性别-年龄
        ArrayList<String> infos = getInfos(familyNameList, boyNameList, girlNameList, 20, 25);
        Collections.shuffle(infos);
        //System.out.println(infos);

        //6、写出数据
        BufferedWriter bw = new BufferedWriter(new FileWriter("/Users/zhaoxiaoyong/Documents" +
                "/Java/IO_stream_project/Case_module/src/NameInfos.txt"));
        for (String info : infos) {
            bw.write(info);
            bw.newLine();
        }
        bw.close();
    }

    /*
     *   作用：
     *       获取男生和女生的信息：张三-男-23
     *   形参：
     *       参数一：装着姓氏的集合
     *       参数二：装着男生名字的集合
     *       参数三：装着女生名字的集合
     *       参数四：男生个数
     *       参数五：女生个数
     */
    public static ArrayList<String> getInfos(ArrayList<String> familyNameList, ArrayList<String> boyNameList, ArrayList<String> girlNameList, int boyCount, int girlCount) {
        //1、生成男生不重复的名字
        HashSet<String> boyhs = new HashSet<>();
        while (true) {
            if (boyhs.size() == boyCount) {
                break;
            }
            //随机
            Collections.shuffle(familyNameList);
            Collections.shuffle(boyNameList);
            boyhs.add(familyNameList.get(0) + boyNameList.get(0));
        }
        //System.out.println(boyhs);

        //2、生成女生不重复的名字
        HashSet<String> girlhs = new HashSet<>();
        while (true) {
            if (girlhs.size() == girlCount) {
                break;
            }
            //随机
            Collections.shuffle(familyNameList);
            Collections.shuffle(girlNameList);
            girlhs.add(familyNameList.get(0) + girlNameList.get(0));
        }
        //System.out.println(girlhs);

        //3、生成男生信息并添加到集合当中
        ArrayList<String> list = new ArrayList<>();
        Random r = new Random();

        for (String boyName : boyhs) {
            int age = r.nextInt(10) + 18;
            list.add(boyName + "-男-" + age + "-1");
        }

        //4、生成女生信息并添加到集合当中
        for (String girlName : girlhs) {
            int age = r.nextInt(8) + 18;
            list.add(girlName + "-女-" + age + "-1");

        }
        return list;
    }

    /*
     *   作用：根据正则表达式获取字符串中的数据
     *
     *   参数一：
     *       完整的字符串
     *
     *   参数二：
     *       正则表达式
     *
     *   返回值：
     *       真正想要的数据
     *
     * */
    private static ArrayList<String> getData(String str, String regex, int index) {
        //1、创建集合存放数据
        ArrayList<String> list = new ArrayList<>();
        //2、按照正则表达式的规则，去获取数据
        Pattern pattern = Pattern.compile(regex);
        //3、按照pattern的规则，到str当中获取数据
        Matcher matcher = pattern.matcher(str);
        while (matcher.find()) {
            String group = matcher.group(index);
            list.add(group);
        }

        return list;
    }

    /*
     *   作用：
     *       从网络中爬取数据，把数据拼接成字符串返回
     *   形参：
     *       网址
     *   返回值：
     *       爬取到的所有数据
     * */
    public static String webCrawler(String net) throws IOException {
        //1、定义StringBuilder拼接爬取到的数据
        StringBuilder sb = new StringBuilder();
        //2、创建一个URL对象
        URL url = new URL(net);
        //3、链接上这个网址
        //细节：保证网络是通畅的，而且这个网址是可以链接上的
        URLConnection conn = url.openConnection();
        //4、读取数据
        InputStreamReader isr = new InputStreamReader(conn.getInputStream());
        int ch;
        while ((ch = isr.read()) != -1) {
            sb.append((char) ch);
        }
        //5、释放资源
        isr.close();
        //6、把读取到的数据返回
        return sb.toString();
    }
}
